﻿using Opc.Ua;
using OpcUaHelper;

namespace Zhaoxi.OpcUAHelperDemo
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            #region OpcUaHelper库
            await OpcUaHelperTest();
            #endregion

            Console.ReadKey();
        }

        #region OpcUaHelper应用
        private static async Task OpcUaHelperTest()
        {
            // 目的:连接、读取、写入、浏览节点
            OpcUaClient client = new OpcUaClient();
            // 匿名连接
            client.UserIdentity = new UserIdentity(new AnonymousIdentityToken());
            // 用户名密码连接
            //client.UserIdentity = new UserIdentity("Zhaoxi", "123456");

            await client.ConnectServer("opc.tcp://127.0.0.1:49320");

            // 同步读
            //ushort value = client.ReadNode<ushort>("ns=2;s=通道 1.设备 1.标记 1");
            //DataValue dataValue = client.ReadNode("ns=2;s=通道 1.设备 1.标记 1");
            //Console.WriteLine(dataValue.Value);

            // 异步读
            //ushort value = await client.ReadNodeAsync<ushort>("ns=2;s=通道 1.设备 1.标记 1");
            //Console.WriteLine(value);

            // 多个读取
            //List<NodeId> nodeIds = new List<NodeId>()
            //{
            //    new NodeId("ns=2;s=通道 1.设备 1.标记 1"),
            //    new NodeId("ns=2;s=通道 1.设备 1.标记 2"),
            //};
            //List<DataValue> values = client.ReadNodes(nodeIds.ToArray());

            //foreach (var item in values)
            //{
            //    Console.WriteLine(item);
            //}

            // 订阅
            // 参数1,key用于之后响应的时候知道是哪个订阅
            client.AddSubscription("123", "ns=2;s=通道 1.设备 1.标记 1", (key, mi, ea) => 
            {
                Console.WriteLine(key);
            });

            // 删除所有订阅
            //client.RemoveAllSubscription();
            // 删除指定订阅
            //client.RemoveSubscription("123");

            // 写入
            //bool r1 = client.WriteNode<ushort>("ns=2;s=通道 1.设备 1.标记 2", 666);
            //bool r2 = await client.WriteNodeAsync<ushort>("ns=2;s=通道 1.设备 1.标记 2", 888);
            //Console.WriteLine(r1 + "," + r2);

            // 多个写入
            //string[] nodes = new string[] { "ns=2;s=通道 1.设备 1.标记 1", "ns=2;s=通道 1.设备 1.标记 2" };
            //object[] values = new object[] { (UInt16)666, (UInt16)777 };
            //client.WriteNodes(nodes, values);

            // 浏览节点
            //BrowseDescriptionCollection browseDescriptions = new BrowseDescriptionCollection();
            //BrowseDescription bd = new BrowseDescription();
            //bd.NodeId = "i=85";  // Objects文件夹
            //browseDescriptions.Add(bd);
            //// 参数3：是否抛出异常
            //var browse = FormUtils.Browse(client.Session, browseDescriptions, false);
        }
        #endregion
    }
}
